package com.agenda.util;

import java.io.InputStream;
import java.io.OutputStream;

public class FileUtil {

	private static final int TAMANHO_PADRAO = 4096;

	private static final int PARAR = 0;
	private static final int CONTINUA = 1;

	private static final boolean DEBUG = false;

	public synchronized static void enviar(OutputStream out, InputStream in, InputStream confirmacaoStream) throws Exception {

		byte[] buf = new byte[TAMANHO_PADRAO];
		int len = TAMANHO_PADRAO;

		while ((len = in.read(buf)) > 0) {
			debug("Indo escrever contunua o len = " + len);
			out.write(CONTINUA);
			out.write(buf, 0, len);
			debug("Já escreveu " + len);

			if (len < TAMANHO_PADRAO) {
				debug("Dando o flush para ver se libera a comunica" + len);
				out.flush();
			}

			debug("Aguardando Confrimacao ");
			int confirmacao = confirmacaoStream.read();
			debug("Confrimacao " + confirmacao);
		}
		debug("Parou de enviar Enviando parar");
		out.write(PARAR);
		out.flush();
	}

	public static void receber(OutputStream out, InputStream in, OutputStream responderRecebeuStream) throws Exception {

		byte[] buf = new byte[TAMANHO_PADRAO];
		int len = TAMANHO_PADRAO;
		int ehParaCOntinuar = -1;
		int horaDoFlush = 0;
		int count = 0;
		while ((ehParaCOntinuar = in.read()) == CONTINUA) {
			debug("EH PARA CONTUNUAR " + ehParaCOntinuar);
			debug("Indo ler o buff? ");
			if ((len = in.read(buf)) > 0) {
				debug("Veu o buff! ");
				out.write(buf, 0, len);
				horaDoFlush += len;

				if (horaDoFlush > 50000) { //Descarrega no disco para nao dar out of memory.
					out.flush();
					horaDoFlush = 0;
				}
			}

			count++;
			debug("Indo responder que leu o buff." + count);
			responderRecebeuStream.write(count);
			debug("Aguardando Continua? ");
		}
		debug("EH PARA CONTUNUAR " + ehParaCOntinuar);
		//debug(" VENHO O FIM DE UM ARQUIVO. <<<<" + len + ">>>>");

		debug("Saiu do while");
	}

	private static void debug(String msg) {
		if (DEBUG)
			System.out.println(msg);
	}
}
